//
//  astVisitor.h
//  ltlbmc
//
//  Created by GD Huang on 6/23/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#ifndef ltlbmc_astVisitor_h
#define ltlbmc_astVisitor_h

#include "attrparam.h"
#include "constant.h"
#include "global.h"
#include "init.h"
#include "instr.h"
#include "label.h"
#include "lhost.h"
#include "offset.h"
#include "stmtkind.h"
#include "typsig.h"


namespace cilast {
    
    class attrparam;
    class AInt;
    class AStr;
    class ACons;
    class ASizeOf;
    class ASizeOfE;
    class ASizeOfS;
    class AAlignOf;
    class AAlignOfE;
    class AAlignOfS;
    class AUnOp;
    class ABinOp;
    class ADot;
    class AStar;
    class AAddrOf;
    class AIndex;
    class AQuestion;

    
    class constant;    
    class CInt64;
    class CStr;
    class CWStr;
    class CChr;
    class CReal;
    class CEnum;
    
    class exp;
    class Const;
    class Lval;
    class SizeOf;
    class SizeOfE;
    class SizeOfStr;
    class AlignOf;
    class AlignOfE;
    class UnOp;
    class BinOp;
    class CastE;
    class AddrOf;
    class StartOf;
    
    class global;
    class GType;
    class GCompTag;
    class GCompTagDecl;
    class GEnumTag;
    class GEnumTagDecl;
    class GVarDecl;
    class GVar;
    class GFun;
    class GAsm;
    class GPragma;
    class GText;
    
    class init;
    class SingleInit;    
    class OffsetInit;
    class CompoundInit;
    
    
    class instr;
    class Set;
    class Call;
    class Asm;
    
    class label;
    class Label;
    class Case;
    class Default;
     
    
    class lhost;    
    class Var;
    class Mem;
    
    class offset;
    class NoOffset;
    class OField;
    class Index;
    
    class typ;
    class TVoid;
    class TInt;
    class TFloat;
    class TArray;
    class TFun;
    class TNamed;
    class TComp;
    class TEnum;
    class TBuiltin_va_list;
    
    class typsig;
    class TSArray;
    class TSPtr;
    class TSComp;
    class TSFun;
    class TSEnum;
    class TSBase;
    
    
    class stmtkind;   
    class Instr;
    class Return;
    class Goto;
    class Break;
    class Continue;
    class If;
    class Switch;
    class Loop;
    class Block;
    class TryFinally;
    class TryExcept;
    

    
    
    class astVisitor {
    public:
        
        astVisitor() {};
        
        //attrparam
        virtual int visit(attrparam*) {};
        virtual int visit(AInt*) {};
        virtual int visit(AStr*) {};
        virtual int visit(ACons*) {};
        virtual int visit(ASizeOf*) {};
        virtual int visit(ASizeOfE*) {};
        virtual int visit(ASizeOfS*) {};
        virtual int visit(AAlignOf*) {};
        virtual int visit(AAlignOfE*) {};
        virtual int visit(AAlignOfS*) {};
        virtual int visit(AUnOp*) {};
        virtual int visit(ABinOp*) {};
        virtual int visit(ADot*) {};
        virtual int visit(AStar*) {};
        virtual int visit(AAddrOf*) {};
        virtual int visit(AIndex*) {};
        virtual int visit(AQuestion*) {};
        
        //constant
        virtual int visit(constant*) {};
        virtual int visit(CInt64*) {};
        virtual int visit(CStr*) {};
        virtual int visit(CWStr*) {};
        virtual int visit(CChr*) {};
        virtual int visit(CReal*) {};
        virtual int visit(CEnum*) {};
        
        //exp
        virtual int visit(exp*) {};
        virtual int visit(Const*) {};
        virtual int visit(Lval*) {};
        virtual int visit(SizeOf*) {};
        virtual int visit(SizeOfE*) {};
        virtual int visit(SizeOfStr*) {};
        virtual int visit(AlignOf*) {};
        virtual int visit(AlignOfE*) {};
        virtual int visit(UnOp*) {};
        virtual int visit(BinOp*) {};
        virtual int visit(CastE*) {};
        virtual int visit(AddrOf*) {};
        virtual int visit(StartOf*) {};
        
        //global
        virtual int visit(global*) {};
        virtual int visit(GType*) {};
        virtual int visit(GCompTag*) {};
        virtual int visit(GCompTagDecl*) {};
        virtual int visit(GEnumTag*) {};
        virtual int visit(GEnumTagDecl*) {};
        virtual int visit(GVarDecl*) {};
        virtual int visit(GVar*) {};
        virtual int visit(GFun*) {};
        virtual int visit(GAsm*) {};
        virtual int visit(GPragma*) {};
        virtual int visit(GText*) {};
        
        //init
        virtual int visit(init*) {} ;
        virtual int visit(SingleInit*) {};
        virtual int visit(OffsetInit*) {};
        virtual int visit(CompoundInit*) {};
        
        //instr
        virtual int visit(instr*) {};
        virtual int visit(Set*) {};
        virtual int visit(Call*) {};
        virtual int visit(Asm*) {};
        
        //label
        virtual int visit(label*) {};
        virtual int visit(Label*) {};
        virtual int visit(Case*) {};
        virtual int visit(Default*) {};
        
        //lhost
        virtual int visit(lhost*) {};
        virtual int visit(Var*) {};
        virtual int visit(Mem*) {};
        
        //offset
        virtual int visit(offset*) {};
        virtual int visit(NoOffset*) {};
        virtual int visit(OField*) {};
        virtual int visit(Index*) {};

        //stmtkind
        virtual int visit(stmtkind*) {};
        virtual int visit(Instr*) {};
        virtual int visit(Return*) {};
        virtual int visit(Goto*) {};
        virtual int visit(Break*) {};
        virtual int visit(Continue*) {};
        virtual int visit(If*) {};
        virtual int visit(Switch*) {};
        virtual int visit(Loop*) {};
        virtual int visit(Block*) {};
        virtual int visit(TryFinally*) {};
        virtual int visit(TryExcept*) {};
        
        //typ
        virtual int visit(typ*) {};
        virtual int visit(TVoid*) {};
        virtual int visit(TInt*) {};
        virtual int visit(TFloat*) {};
        virtual int visit(TArray*) {};
        virtual int visit(TFun*) {};
        virtual int visit(TNamed*) {};
        virtual int visit(TComp*) {};
        virtual int visit(TEnum*) {};
        virtual int visit(TBuiltin_va_list*) {};

        //typsig
        virtual int visit(typsig*) {};
        virtual int visit(TSArray*) {};
        virtual int visit(TSPtr*) {};
        virtual int visit(TSComp*) {};
        virtual int visit(TSFun*) {};
        virtual int visit(TSEnum*) {};
        virtual int visit(TSBase*) {};

        
    };
}

#endif
